package tree;

import java.util.LinkedList;
import java.util.List;

/**
 * Created by admin on 17/3/29.
 */
public class Tree {
    /**
     * 生成一个完全二叉树
     *
     * @param array
     * @return
     */
    private static List<Node> createBinTree(int[] array) {
        List<Node> nodeList = new LinkedList<Node>();
        // 将一个数组的值依次转换为Node节点
        for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
            nodeList.add(new Node(array[nodeIndex]));
        }
        // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
        for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
            // 左孩子
            nodeList.get(parentIndex).setLeftChild(nodeList
                    .get(parentIndex * 2 + 1));
            // 右孩子
            nodeList.get(parentIndex).setRightChild(nodeList
                    .get(parentIndex * 2 + 2));
        }
        // 最后一个父节点:因为最后一个父节点可能没有右孩子，所以单独拿出来处理
        int lastParentIndex = array.length / 2 - 1;
        // 左孩子
        nodeList.get(lastParentIndex).setLeftChild(nodeList
                .get(lastParentIndex * 2 + 1));
        // 右孩子,如果数组的长度为奇数才建立右孩子
        if (array.length % 2 == 1) {
            nodeList.get(lastParentIndex).setRightChild(nodeList
                    .get(lastParentIndex * 2 + 2));
        }

        return nodeList;
    }

    /**
     * 前序遍历
     *
     * @param node
     */
    private static void preOrder(Node node) {
        if (node != null) {
            System.out.println(node.getData());
            preOrder(node.getLeftChild());
            preOrder(node.getRightChild());
        }
    }

    /**
     * 中序遍历
     *
     * @param node
     */
    private static void inOrder(Node node) {
        if (node != null) {
            preOrder(node.getLeftChild());
            System.out.println(node.getData());
            preOrder(node.getRightChild());
        }
    }

    /**
     * 后序遍历
     *
     * @param node
     */
    private static void postOrder(Node node) {
        if (node != null) {
            preOrder(node.getLeftChild());
            preOrder(node.getRightChild());
            System.out.println(node.getData());
        }
    }

    /**
     * 求深度
     *
     * @param node
     */
    private static int deep(Node node) {
        if (node == null) {
            return 0;
        }
        int left = deep(node.getLeftChild());

        int right = deep(node.getRightChild());

        if (left > right) {
            return left + 1;
        } else {
            return right + 1;
        }
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        List<Node> nodes = createBinTree(array);
//        preOrder(nodes.get(0));
        System.out.println(deep(nodes.get(0)));
    }
}
